import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.junit.Assert;
import org.junit.Test;
import 遍历器.定义监听器;
import 遍历器.引用监听器;
import 遍历器.抽象语法树基础遍历器;
import 遍历器.类型提升监听器;

import java.io.IOException;
import java.net.URISyntaxException;

public class 测试类型提升 {
    @Test
    public void 测试() throws IOException, URISyntaxException {
        
        var 源代码 = Tools.读文件(Tools.getResourcePath("t.cymbol"));
        var input = CharStreams.fromString(源代码);
        var lexer = new CymbolLexer(input);// 词法分析器，将输入文本转换为词法符号
        var tokens = new CommonTokenStream(lexer);// 词法符号流
        var parser = new CymbolParser(tokens);// 语法分析器
        
        var 树 = new Cymbol语言访问器().visit(parser.compilationUnit());
        
        var 定义监听器 = new 定义监听器();
        new 抽象语法树基础遍历器(定义监听器).遍历(树);

        System.out.println("-----------------------------------");
        
        var 引用监听器 = new 引用监听器(定义监听器.符号表);
        new 抽象语法树基础遍历器(引用监听器).遍历(树); // todo: 基础遍历器无需存监听器，只需在遍历的时候传入监听器即可
        
        Assert.assertNotNull(定义监听器.符号表);


        System.out.println("-----------------------------------");
        
        
        var 类型提升监听器 = new 类型提升监听器(tokens);
        new 抽象语法树基础遍历器(类型提升监听器).遍历(树);

        System.out.println("-----------------------------------");
        
        System.out.println(类型提升监听器.取输出文本());
    }
}
